package com.project.gobang.Test;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Component
public class TestAPI extends TextWebSocketHandler {

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 当我们连接建立就绪后, 就会触发这个方法, 通过这个方法就可以感知到客户端已建立连接, 或者说用户已上线这件事
        System.out.println("连接成功");
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        // 通过这个方法来获取到客户端给服务器发送的 text 文本消息里面的内容
        // message 就是这个文本消息的对象, getPayload() 就是获取里面的数据载荷.
        System.out.println("收到消息: " + message.getPayload());

        // 让服务器收到数据之后, 把原数据返回回去.
        // 这里的 session 是 WebSocket 的一次会话, 不是之前学的 http 的会话(虽然机制是一样的, 但不是同一个东西, 作用域不同)
        session.sendMessage(message);
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        // 如果传输出现一些异常, 比如说网络波动导致连接断开, 此时就会触发这个方法, 让程序员知道此时连接出现了问题, 并进行处理
        System.out.println("连接异常");
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 如果连接被关闭(不管是客户端还是服务器关闭, 但一般来说都是客户端关闭, 因为服务器非必要不会关闭), 就会执行这个方法
        // 通过后面两个方法, 我们就能感知到用户断开连接的过程
        System.out.println("连接关闭");
    }
}
